package com.zlf.sb.demo.completableFuture.chuanxing;

import com.zlf.sb.demo.util.SmallTool;

import java.util.concurrent.CompletableFuture;

/**
 * 4.1.1 前一个返回有结果再执行下一个  thenCompose 、  thenApply()、thenApplyAsync、  thenAccept() 、thenRun()
 * 作用都是使得一个阶段的结果可以作为下一个阶段的输入
 *
 * 尽管它们的目标相同，但它们在使用方式和功能上有一些区别。
 *
 * thenCompose()和thenApply()方法用于将前一个阶段的结果与下一个阶段进行组合
 * thenApplyAsync()方法在此基础上实现异步执行
 * thenAccept()方法用于处理前一个阶段的结果而不需要返回值
 * thenRun()方法用于在前一个阶段完成后执行一些操作
 */
public class CompletableFutureTest {
    public static void main(String[] args) {
        SmallTool.printTimeAndThread("小白进入餐厅");
        SmallTool.printTimeAndThread("小白点了 番茄炒蛋 + 一碗米饭");

        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            SmallTool.printTimeAndThread("厨师炒菜");
            SmallTool.sleepMillis(200);
            return "番茄炒蛋";
        }).thenCompose(dish -> CompletableFuture.supplyAsync(() -> {
            SmallTool.printTimeAndThread("服务员打饭");
            SmallTool.sleepMillis(100);
            return dish + " + 米饭";
        }));

        SmallTool.printTimeAndThread("小白在打王者");
        SmallTool.printTimeAndThread(String.format("%s 好了,小白开吃", cf1.join()));
    }
}
